/**
 * @file xtp_btn.h
 *
 * @note 使用方法：
 * 1. 创建全局 xtp_btn_t 变量
 * 2. 使用 xtp_btn_create() 创建按键对象
 * 3. 在 tick 钩子函数中调用 key_scan()
 * 4. 创建钩子函数，并在钩子函数中判断按键逻辑
 *
 * @example
 * ok_btn = xtp_btn_create(EC11_BTN_IO, "OK_BTN", ec11_btn_callback);
 * void ec11_btn_callback(void)
 * {
 *
 *     if (ok_btn.click_count == 1)
 *     {
 *         xtp_system.test_num++;
 *
 *     }
 *     if (ok_btn.click_count == 2)
 *     {
 *         xtp_system.test_num += 2;
 *
 *     }
 *     if (ok_btn.click_count >= 3)
 *     {
 *         xtp_system.test_num = 0;
 *
 *     }
 *     if (ok_btn.click_count == 0)
 *     {
 *         ok_btn.result = NO_CLICK;
 *     }
 * }
 */
#ifndef __XTP_BTN_H
#define __XTP_BTN_H

#include <stdio.h>
#include "driver/gpio.h"

#define EC11_BTN_IO GPIO_NUM_5
#define EC11_BTN_GET() gpio_get_level(EC11_BTN_IO)
#define USE_BTN_IO GPIO_NUM_18

#define BTN_NAME_LENGTH 8 /* 按键名字的长度 */

typedef enum
{
    CLICK = 0,    /* 单击 */
    DOUBLE_CLICK, /* 双击 */
    THREE_CLICK,  /* 三连击 */
    LOOP_PRESS,   /* 按键一直按下 */
    NO_CLICK

} btn_result_enum_t;

typedef struct
{
    gpio_num_t port; /* 按键 IO 口 */
    btn_result_enum_t result;
    char btn_name[BTN_NAME_LENGTH]; /* 按键名字 */
    uint16_t btn_buff;
    uint8_t first_flag : 1;     /* 第一次 按下标志 */
    uint8_t total_flag : 1;     /* 总标志位，用来判断整个按键过程的标志 */
    uint32_t time_count;        /* 长按时间计时 */
    uint32_t total_time_count;  /* 总时间, 如果 total_time_count 超过2s无按键按下则代表没有任何动作（双击/3击） */
    uint8_t press_time_num;     /* 长按时用于设定多少ms执行一次+1 */
    uint8_t click_count;        /* 按键单击次数变量 */
    void (*key_callback)(void); /* 回调函数 */
} xtp_btn_t;

void key_scan(xtp_btn_t *btn);
xtp_btn_t xtp_btn_create(gpio_num_t port, char *btn_name, void (*key_callback)());

#endif /* __XTP_BTN_H */